package br.com.iswe.gwt.ui.client;

import br.com.iswe.gwt.ui.client.base.BaseListaPanel;
import br.com.iswe.gwt.ui.client.img.CommonImageBundle;
import br.com.iswe.gwt.util.client.QueryInfo;
import br.com.iswe.gwt.util.client.QueryListener;

import com.google.gwt.user.client.ui.ButtonBase;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;

public class PaginacaoPanel extends FlexTable {

	private BaseListaPanel baseListaPanel = null;
	
	private Image separador;
	private ButtonBase primeiraPagina;
	private ButtonBase anterior;
	private ButtonBase proxima;
	private ButtonBase ultimaPagina;
	
	private int totalPaginas 	= -1;
	private int numeroPagina  	= -1;
	private int tamanhoPagina 	= -1;
	
	private QueryListener queryListener;
	
	public PaginacaoPanel(BaseListaPanel baseListaPanel) {
		this.baseListaPanel = baseListaPanel;
		//Inicializa as imagens
		CommonImageBundle commonImageBundle = ISWEImageFactory.getCommonImageBundle();
		separador 		= commonImageBundle.separador02().createImage();
		primeiraPagina	= ISWEImageFactory.inicioButton();
		anterior		= ISWEImageFactory.anteriorButton();
		proxima			= ISWEImageFactory.proximoButton();
		ultimaPagina	= ISWEImageFactory.ultimoButton();
		
		initLayout();
	}
	
	public void reset() {
		totalPaginas 	= -1;
		numeroPagina  	= -1;
		tamanhoPagina 	= -1;
	}
	
	protected void initLayout() {
		setCellSpacing(6);
		setWidth("100%");
		setStyleName("paginacaoPanel");
		
		setWidget(0, 0, new Label(" "));
		
		setWidget(0, 1, primeiraPagina);
		setWidget(0, 2, anterior);
		setWidget(0, 3, separador);
		setWidget(0, 4, proxima);
		setWidget(0, 5, ultimaPagina);
		
		//configura a tabela
		getFlexCellFormatter().setWidth(0, 0, "50%");
		
		getFlexCellFormatter().setAlignment(0, 1, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		getFlexCellFormatter().setWidth(0, 1, "10%");
				
		getFlexCellFormatter().setAlignment(0, 2, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		getFlexCellFormatter().setWidth(0, 2, "10%");
		
		getFlexCellFormatter().setAlignment(0, 3, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		getFlexCellFormatter().setWidth(0, 3, "10%");
		
		getFlexCellFormatter().setAlignment(0, 4, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		getFlexCellFormatter().setWidth(0, 4, "10%");
		
		getFlexCellFormatter().setAlignment(0, 5, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		getFlexCellFormatter().setWidth(0, 5, "10%");
		
		//configura os listeners
		primeiraPagina.addClickListener(primeiraPaginaListener);
		anterior.addClickListener(anteriorListener);
		proxima.addClickListener(proximaListener);
		ultimaPagina.addClickListener(ultimaPaginaListener);
	}

	
	//////////////////////////////////////////////
	//// Handlers - Listeners 
	//////////////////////////////////////////////
	ClickListener primeiraPaginaListener = new ClickListener(){
		public void onClick(Widget sender) {
			if(numeroPagina > 1){
				QueryInfo queryInfo = new QueryInfo();
				queryInfo.setPaginacao(true);
				numeroPagina = 1;
				queryInfo.setNumeroPagina(numeroPagina);
				queryInfo.setTamanhoPagina(tamanhoPagina);
				queryListener.execute(queryInfo);
			}
		}		
	};
	ClickListener anteriorListener = new ClickListener(){
		public void onClick(Widget sender) {
			if(numeroPagina > 1){
				QueryInfo queryInfo = new QueryInfo();
				queryInfo.setPaginacao(true);
				queryInfo.setNumeroPagina(--numeroPagina);
				queryInfo.setTamanhoPagina(tamanhoPagina);
				queryListener.execute(queryInfo);
			}
		}		
	};
	ClickListener proximaListener = new ClickListener(){
		public void onClick(Widget sender) {
			if(numeroPagina < totalPaginas || totalPaginas == -1){
				QueryInfo queryInfo = new QueryInfo();
				queryInfo.setPaginacao(true);
				queryInfo.setNumeroPagina(++numeroPagina);
				queryInfo.setTamanhoPagina(tamanhoPagina);
				queryListener.execute(queryInfo);
			}
		}		
	};
	ClickListener ultimaPaginaListener = new ClickListener(){
		public void onClick(Widget sender) {
			if(totalPaginas != -1){
				QueryInfo queryInfo = new QueryInfo();
				queryInfo.setPaginacao(true);
				numeroPagina = totalPaginas;
				queryInfo.setNumeroPagina(numeroPagina);
				queryInfo.setTamanhoPagina(tamanhoPagina);
				queryListener.execute(queryInfo);
			}
			else{
				proximaListener.onClick(sender);
			}
		}		
	};
	
	public BaseListaPanel getBaseListaPanel() {
		return baseListaPanel;
	}
	public void setBaseListaPanel(BaseListaPanel baseListaPanel) {
		this.baseListaPanel = baseListaPanel;
	}

	public ClickListener getAnteriorListener() {
		return anteriorListener;
	}

	public void setAnteriorListener(ClickListener anteriorListener) {
		this.anteriorListener = anteriorListener;
	}

	public ClickListener getPrimeiraPaginaListener() {
		return primeiraPaginaListener;
	}

	public void setPrimeiraPaginaListener(ClickListener primeiraPaginaListener) {
		this.primeiraPaginaListener = primeiraPaginaListener;
	}

	public ClickListener getProximaListener() {
		return proximaListener;
	}

	public void setProximaListener(ClickListener proximaListener) {
		this.proximaListener = proximaListener;
	}

	public int getTotalPaginas() {
		return totalPaginas;
	}

	public void setTotalPaginas(int totalPaginas) {
		this.totalPaginas = totalPaginas;
	}

	public ClickListener getUltimaPaginaListener() {
		return ultimaPaginaListener;
	}

	public void setUltimaPaginaListener(ClickListener ultimaPaginaListener) {
		this.ultimaPaginaListener = ultimaPaginaListener;
	}

	public int getNumeroPagina() {
		return numeroPagina;
	}

	public void setNumeroPagina(int paginaAtual) {
		this.numeroPagina = paginaAtual;
	}

	public int getTamanhoPagina() {
		return tamanhoPagina;
	}

	public void setTamanhoPagina(int tamanhoPagina) {
		this.tamanhoPagina = tamanhoPagina;
	}

	public QueryListener getQueryListener() {
		return queryListener;
	}

	public void setQueryListener(QueryListener queryListener) {
		this.queryListener = queryListener;
	}
}
